<!doctype html>
<html lang="zh">
<head>
  <meta charset="utf-8">
  <title>KISSY - 全终端适配的 JS 类库</title>
  <meta name="viewport" content="width=device-width">
  <link href="http://fonts.googleapis.com/css?family=Droid+Sans|Lekton|Ubuntu+Mono:400,700" rel="stylesheet">
	<link rel="stylesheet" href="templates/assets/bootstrap.css">
	<link href="templates/assets/normalize.css" rel="stylesheet">
	<link href="templates/assets/kissy.css" rel="stylesheet">
	<link href="templates/assets/prettify.css" rel="stylesheet">
	<link href="templates/assets/forkit.css" rel="stylesheet">
	<script src="templates/assets/jquery.min.js"></script>
	<script src="templates/assets/script.js" type="text/javascript"></script>
	<script src="http://g.tbcdn.cn/trip/kissy/1.4.0/seed-min.js"></script>
	<script src="api/assets/highlight.pack.js"></script>
	<link href="api/assets/tomorrow-night-bright.css" rel=stylesheet />
	<link rel="shortcut icon" href="http://a.tbcdn.cn/s/kissy/favicon.ico">
</head>

<body class="">
    <nav id="sidebar">
    <header>
		<a href="index.html">
			<!--img src="http://gtms04.alicdn.com/tps/i4/T1ceiPFbpcXXcljp_h-200-89.png"-->
			<!--img src="templates/assets/img/logo_6.png"-->
			<!--img src="http://gtms04.alicdn.com/tps/i4/T14oa2FcNcXXaOySEh-180-104.png" alt="" /-->
			<!--img src="http://gtms01.alicdn.com/tps/i1/T1Amq1FaXgXXbXVSUh-180-127.png" alt="" /-->
			<img src="http://gtms02.alicdn.com/tps/i2/T1N0jTXXXjXXay7Rri-175-78.png" alt="" />
		</a>
	</header>
    <ul>
      <li class="nav-divider"><a href="index.html"><img src="templates/assets/img/icon-home.png">首页</a></li>
      <li class="nav-divider"><a href="why-kissy.html"><img src="templates/assets/img/icon-why.png">Why KISSY?</a></li>
      <li><a href="get-started.html"><img src="templates/assets/img/icon-getting-started.png">KISSY 1.4.x 教程大纲</a></li>
      <li class="nav-sub"><a href="module-map.html">核心模块列表</a></li>
      <li class="nav-sub"><a href="kmd.html">KISSY 模块规范 (KMD)</a></li>
      <li class="nav-sub"><a href="gbs.html">浏览器兼容基准(GBS)</a></li>
      <li class="nav-sub"><a href="http://cyj.me/jquery-kissy-rosetta/">jQuery KISSY 对比手册</a></li>
      <li class="nav-sub"><a href="http://gallery.kissyui.com/guide">KISSY 组件开发规范</a></li>
      <li class="nav-sub nav-divider"><a href="history.html">历史版本</a></li>
      <li><a href="">API Doc</a></li>
      <li><a href="http://demo.kissyui.com">Demos</a></li>
      <li class="nav-divider"><a href="http://gallery.kissyui.com">KISSY Gallery</a></li>
      <li><a href="tools.html">KISSY 项目构建工具</a></li>
      <li class="nav-sub"><a href="kmc.html">KS Module Compiler</a></li>
      <li class="nav-sub"><a href="http://abc.f2e.taobao.net">ABC</a></li>
      <li class="nav-sub nav-divider"><a href="clam.html">Clam</a></li>
      <li><a href="third-party-lib.html">第三方代码库</a></li>
      <li class="nav-sub"><a href="https://github.com/lorrylockie/tpap/wiki">面向第三方安全的 KISSY</a></li>
      <li class="nav-sub"><a href="http://www.builive.com/demo/index.php">BUI</a></li>
      <li class="nav-sub nav-divider"><a href="http://work.tmall.net/muidoc/build/">MUI</a></li>
      <li><a href="https://github.com/kissyteam/kissy/blob/master/CONTRIBUTING.md">为 KISSY Core 贡献代码</a></li>
      <li class="nav-sub"><a href="http://google-styleguide.googlecode.com/svn/trunk/htmlcssguide.xml">HTML/CSS编码规范</a></li>
      <li class="nav-sub nav-divider"><a href="http://docs.kissyui.com/source/tutorials/style-guide/google/javascriptguide.xml">JavaScript 编码规范</a></li>
	  <li><a href="upgrade.html"><img src="templates/assets/img/icon-documentation.png">1.3.x->1.4.0 升级指南</a></li>
	  <li><a href="faq.html"><img src="templates/assets/img/icon-faqs.png">FAQ</a></li>
      <li><a href="https://github.com/kissyteam/kissy"><img src="templates/assets/img/icon-github.png">GitHub</a></li>
	  <li><a href="core-team.html"><img src="templates/assets/img/icon-google-plus.png">KISSY 核心小组</a></li>
    </ul>
  </nav>

  <div id="content">
    <article>
      

	<p>正在跳转...</p>
<script>
window.location.href="https://npmjs.org/package/generator-clam";
</script>

<h1>KISSY 项目构建工具，Generator-clam</h1>
<p></p>

<p><img src="http://img04.taobaocdn.com/tps/i4/T1C5hpXwXeXXbkQf6j-210-45.jpg" alt=""></p>
<p>环境依赖：Node、Npm，<a href="https://speakerdeck.com/lijing00333/generator-clam">工具原理介绍PPT</a>。视频演示：<a href="http://ascii.io/a/4384">http://ascii.io/a/4384</a>。</p>
<h2>安装 &amp; 基本命令</h2>
<p>首先安装<a href="http://gruntjs.com">grunt</a> 和 <a href="http://yeoman.io/">yeoman</a>：</p>
<pre><code>npm install yo grunt-cli -g</code></pre>
<p> 安装Generator-Clam：</p>
<pre><code>npm install -g generator-clam generator-kissy-gallery</code></pre>
<p>命令：</p>
<ul>
<li><code>yo clam:h</code>:打印帮助</li>
<li><code>yo clam</code>:初始化一个标准的Project</li>
<li><code>yo clam:mod</code>:初始化一个模块</li>
<li><code>yo clam:widget</code>:初始化一个标准kissy组件，首先创建组件空目录，进入空目录后执行此命令</li>
<li><code>yo clam:widget x.y</code>:生成一个标准kissy组件的版本，进入到组件目录后执行。其中x.y是版本号</li>
<li><code>yo clam:on</code>:启动web服务，服务支持SSI，推荐使用<code>grunt server</code></li>
<li><code>yo clam:install &lt;git&gt;</code>:(TODO)git可以是git地址，也可以是Gallery模块名称，都将对应的git项目源码下载到本地，类似<code>svn export</code></li>
<li><code>yo clam:search &lt;name&gt;</code>:(TODO)在Gallery中查找现有的匹配的模块名称</li>
<li><code>yo clam:page</code>:生成一个Page</li>
</ul>
<hr>
<h2>Grunt 内嵌命令</h2>
<p>初始化完成的项目包含Gruntfile.js模板，可以辅助你完成：</p>
<ul>
<li><code>grunt</code>: 执行构建</li>
<li><code>grunt prepub</code>:执行预发</li>
<li><code>grunt publish</code>:执行发布</li>
<li><code>grunt info</code>:查看当前库git地址</li>
<li><code>grunt newbranch</code>:创建新daily分支，基于当前版本累加</li>
<li><code>grunt listen</code>:监听文件修改，实时编译</li>
<li><code>grunt server</code>:开启本地调试模式</li>
<li><code>grunt build</code>:构建包含SSI的html，合并页面中的css和js</li>
</ul>
<h3>本地调试</h3>
<p>本地调试调用了<a href="https://npmjs.org/flex-combo">flex-combo</a>，访问绝对路径时和本地目录有一个映射关系，比如绝对地址映射到项目的<code>src</code>目录：</p>
<pre><code>http://g.tbcdn.cn/group/project/ =&gt; ./src/</code></pre>
<p>启动本地服务：</p>
<pre><code>grunt server</code></pre>
<h3>grunt 构建配置项</h3>
<p><code>Gruntfile.js</code>是Grunt脚本规则文件，此外项目基本参数存放在<code>abc.json</code>中，生成好的<code>abc.json</code>格式如下：</p>
<pre><code>{
    &quot;name&quot;: &quot;h5-test&quot;,
    &quot;desc&quot;: &quot;description of your app&quot;,
    &quot;type&quot;: &quot;clam&quot;,
    &quot;port&quot;:&quot;80&quot;,
    &quot;group&quot;:&quot;trip&quot;,
    &quot;src&quot;:&quot;false&quot;,
    &quot;version&quot;:&quot;0.0.1&quot;,
    &quot;author&quot;: {
        &quot;name&quot;: &quot;&quot;,
        &quot;email&quot;: &quot;&quot;
    },
    &quot;repository&quot;: {
        &quot;type&quot;: &quot;git&quot;,
        &quot;url&quot;: &quot;http://gitlab.alibaba-inc.com/trip/h5-test&quot;
    }
}</code></pre>
<p>生成一个新的daily分支（<code>grunt newbranch</code>）时会自动更新<code>abc.json</code>的<code>version</code>字段。</p>
<blockquote>
<p>ps:grunt构建任务依赖<code>grunt-mytps</code>子任务，该子任务（上传本地图片到CDN并替换地址）依赖python，并需要安装<a href="https://github.com/sodabiscuit/tpsmate">tpsmate</a>。</p>
</blockquote>
<h3>使用 Generator-Clam 应对这三种基本场景</h3>
<p>1，创建新项目</p>
<p><code>yo clam</code>构建新项目时会生成Gruntfile.js。之后你只需特别关注Gruntfile.js即可。</p>
<p>2，接手项目</p>
<p>如果你要接手一个项目，代码检出后即可进行调试；在运行<code>grunt</code>命令之前需要运行<code>npm install</code>。 </p>
<p>3，标准格式的KISSY组件</p>
<p><a href="http://gallery.kissyui.com">KISSY标准组件</a>的构建使用<code>yo kissy-gallery x.y</code>，已经被映射为<code>yo clam:widget</code>，KISSY标准组件是可以直接构建为可发布到淘宝CDN的代码，并提交至<code>kissy gallery</code>中。因此，你的项目中所有widgets都应当和KISSY标准组件格式保持一致，方便被其他项目使用。</p>
<h3>Demo的运行</h3>
<p>Grunt中模板中提供<code>grunt server</code>方法，开启本地服务，默认开启在80端口，在<code>abc.json</code>中修改端口配置。<code>grunt server</code>封装了<code>flexcombo</code>，提供一种最基本的服务：即线上CDN环境映射到本地目录，直接访问屏幕提示给出的URL即可（g.tbcdn.cn host指向本地）</p>
<pre><code>[bachi@yahoo ~/temp/h5-test]&gt; sudo grunt server
Running &quot;server&quot; task

Running &quot;flexcombo:main&quot; (flexcombo) task

Preview: http://g.tbcdn.cn/trip/h5-test/

Flex Combo Server running at http://127.0.0.1:80</code></pre>
<p>访问demo时应当带上<code>?ks-debug</code>，上线后的项目引用<code>config.js</code>的绝对地址即可。</p>
<p>如果想测试build完成后的代码，可以在本地创建软连接，映射线上版本号，通过<code>grunt server</code>启动服务来测试：</p>
<pre><code>ln -s build src/0.1.8</code></pre>
<p>访问<code>http://g.tbcdn.cn/group/project/0.1.8/.../demo.html</code></p>
<blockquote>
<p>这里的SSI兼容apache，但这个Server还是功能很弱，且不支持脚本，我们如果您有服务端脚本需求，建议您使用更成熟的<a href="http://wiki.ued.taobao.net/doku.php?id=ued.bj:f2e:tbcdn">apache+php来作为本地demo服务</a>，Clam只作为构建工具使用。</p>
</blockquote>
<h3>预发和发布</h3>
<p>为了限制在daily分支上发布，我们将grunt构建也加了限制，非daily分支上禁止构建，不建议将此限制去掉，只有build目录中的文件会被发布，所发布的项目中build目录中的文件地址为如下两种，前缀自选</p>
<pre><code>http://a.tbcdn.cn/g/group-name/project-name/x.y.z/mods.js</code></pre>
<p>对应到 g.tbcdn.cn 的地址：</p>
<pre><code>http://g.tbcdn.cn/group-name/project-name/x.y.z/mods.js</code></pre>
<p>代码发布命令：</p>
<p><strong>预发</strong></p>
<pre><code>grunt prepub</code></pre>
<p><strong>发布</strong></p>
<pre><code>grunt publish</code></pre>
<hr>
<h2>再多了解一点<code>Generator-Clam</code></h2>
<h3>CLAM 工具族</h3>
<p><code>Clam</code>是 <a href="http://weibo.com/u/1846621405">陶清</a> 对于前端模块化开的实践和落地项目，它是一个工具，旨在建立标准的模块开发流程，提高代码共享和项目构建效率，同时提供一个本地轻服务，让我们“可以坐在美丽的沙滩上写代码”。</p>
<p><code>Clam</code>之后有两个衍生版本，<code>Clam-tools</code>和<code>Generator-Clam</code>。</p>
<p>1，<a href="http://gitlab.alibaba-inc.com/clam/tree/master">Clam</a></p>
<p>clam包含一套完整的模块化开发思想，用来规范结构化越来越强的前端页面，Clam创建之初还没有Grunt，Clam用Grunt的思路来提供脚手架，用来应对页面结构较为固定的开发场景。</p>
<p>2，<a href="http://gitlab.alibaba-inc.com/jay.li/clam-tools/tree/master">Clam-Tools</a></p>
<p>由于时间仓促，Clam没实现发布、自定义构建和对KISSY的解析，Clam-Tools弥补了这几个空缺，且提供了GUI工具，实现了基于Ant的一键式构建和发布，但前提是你的项目基于SVN发布。另外一个问题在于，前端工程师真的学不会Ant。</p>
<p>3，<a href="http://github.com/jayli/generator-clam">Generator-Clam</a></p>
<p>2013年淘系全面推广基于Gitlab的Assets发布，Generator-Clam 延续了Clam模块化的思想，结合Yeoman和Grunt提供了面向淘系前端环境构建脚手架工具，包含前端开发/构建/发布的全流程。Generator-Clam 对代码单元做更自由的定义，根据适用范围，任何代码单元从三个维度管理：</p>
<ul>
<li>项目（project）（代码集合最大单位）</li>
<li>模块（module）（业务功能单元，部分业务之间可共用）</li>
<li>组件（widget）（可全局共用）</li>
</ul>
<p>最初Clam独立出了Page，Page本身也是一个模块，这里统一用模块来管理。这里的<code>yo clam:page</code>只是生成一个引用了KISSY种子的空页面。</p>
<p>代码单元有自身属性，自身属性只是为了区分其适用范围和生命周期，为了保持约定简单，代码单元在层级上不再做规定，所有模块单元都相互平行，代码之间的依赖和相互引用，取决于你对业务的拆解，不是脚手架的职责。</p>
<p>最重要的，互联网项目的需求是涌现式的，项目的前端架构和设计是在开发中不断调整修改而来，而非开始就设计完成不再动了，这也是代码组织结构尽可能保持和业务弱相关的原因。</p>
<p>最最重要的，组件级（widget）代码从开始就保持标准规范（Kissy Gallery），抽离出项目更方便，这在无常的Web项目中是唯一的促成积累、沉淀代码的方法。</p>
<h3>项目目录结构约定</h3>
<p><code>yo clam</code>可以引导你创建三种格式的目录结构，</p>
<p>第一种，<code>src</code>目录和<code>build</code>目录平行，<code>src</code>目录中直接承载代码单元</p>
<pre><code>./
├── build/ - 构建完成后发布目录
├── doc/ - 生成的文档目录
├── Gruntfile.js
└── src/ - 项目源码目录
    ├── ~page1/ - 页面1
    │   ├── img/
    │   ├── index.css
    │   ├── index.html
    │   ├── demo.html
    │   └── index.js
    ├── mod1/ - 模块1
    │   ├── img/
    │   ├── index.css
    │   ├── index.html
    │   └── index.js
    ├── mod2/ - 模块2
    │   ├── img/
    │   ├── index.css
    │   ├── index.html
    │   └── index.js
    └── widget1/ - 一个Kissy组件
        ├── 1.0
        │   ├── build/
        │   ├── demo/
        │   │   └── index.html
        │   ├── guide/
        │   │   └── index.md
        │   ├── index.js
        │   ├── meta/
        │   │   ├── alias.js
        │   │   └── modules.js
        │   ├── plugin/
        │   └── spec/
        └── Gruntfile.js</code></pre>
<p>第二种，<code>src</code>目录中划分出<code>pages</code>/<code>mods</code>/<code>widgets</code>三个目录，主要是为了兼容老的Clam项目</p>
<p>第三种，代码单元和<code>build</code>目录平行，即无<code>src</code>目录：</p>
<pre><code>./
├── build/
├── doc/
├── Gruntfile.js
├── index.css - 入口css文件样板
├── index.html - 入口html文件样板
├── index.js - 入口js文件样板
├── mod1/ - 模块1
│   ├── img/
│   ├── index.css
│   ├── index.html
│   └── index.js
├── mod2/ - 模块2
│   ├── img
│   ├── index.css
│   ├── index.html
│   └── index.js
└── widget1/ - 一个kissy组件
    ├── 1.0/
    │   ├── build/
    │   ├── demo/
    │   │   └── index.html
    │   ├── guide/
    │   │   └── index.md
    │   ├── index.js
    │   ├── meta/
    │   │   ├── alias.js
    │   │   └── modules.js
    │   ├── plugin/
    │   └── spec/
    └── Gruntfile.js</code></pre>
<p>以上三种目录结构中，widget均和KissyGallery标准组件保持一致。</p>
<h2>Q &amp; A</h2>
<p>1，&#39;yo clam&#39;安装node模块的时候报错？</p>
<pre><code>npm ERR! Error: EACCES, mkdir &#39;/usr/local/lib/node_modules/grunt-xx&#39;</code></pre>
<ul>
<li>原因：没有sudo</li>
<li>解决办法：在当前目录执行<code>sudo npm install</code></li>
</ul>
<p>2，tpsmate安装完了还是不能把图片自动上传CDN?</p>
<ul>
<li>原因：需要首先找到<code>node_modules</code>中手动执行一次</li>
<li>解决办法：进入<code>node_modules/grunt-mytps/tasks/lib/tpsmate/src</code>，执行<code>python ./cli.py upload</code>，这时提示你输入TMS用户名和密码，完成即可</li>
</ul>
<p>详细文档参照：<a href="https://github.com/sodabiscuit/tpsmate">https://github.com/sodabiscuit/tpsmate</a></p>
<p>3，tpsmate安装完成，但执行报错？</p>
<ul>
<li>原因：依赖包不完整</li>
<li><p>解决办法：安装tpsmate的依赖</p>
<p>  pip install -r node_modules/grunt-mytps/tasks/lib/tpsmate/src/requirements.txt</p>
</li>
</ul>
<p>4，yo clam 构建好目录结构后安装npm包时间太长，怎么办？</p>
<ul>
<li>原因：构建项目最后使用<code>npm install</code>安装npm包</li>
<li>解决办法：在首次构建项目的时候最后一步询问是否安装本地<code>node_modules</code>，输入<code>N</code>，在当前目录使用<code>npm install --link</code>，将包安装到全局。以后每次<code>yo clam</code>最后都不安装本地包，使用<code>npm install --link</code>来安装，速度会很快。</li>
</ul>
<p>5，yo clam:mod 构建好一个模块后，怎么运行它？</p>
<p>直接访问生成好的html文件，<code>xx/index.html?ks-debug</code>，会有弹框&quot;ok&quot;。</p>
<p>6，生成的默认Gruntfile.js只根据入口文件合并JS，我如何生成依赖关系表mods.js ？</p>
<p>修改Gruntfile.js，参照注释修改kmc任务。有一点需要注意，如果要生成依赖关系表，你的JS源文件必须带有模块名定义，比如：</p>
<pre><code>// 模块名不能省略
KISSY.add(&#39;grp/header/index&#39;,function(S){
    // your code
});</code></pre>
<p>7，<code>grunt server</code>启动报错<code>Error: listen EACCES。</code></p>
<p>在Mac/Linux下需要root权限才能启用80端口，加上sudo</p>
<pre><code>sudo grunt server</code></pre>
<p>8，<code>grunt server</code>提示Error: listen EADDRINUSE。</p>
<p>Flex Combo所需要使用的端口正在被使用中，如果这个端口是80端口，你需要检查系统中是否有其他web容器，比如Apache、Nginx等是否使用了80端口。如果不是，你需要检查是否系统中有其他Flex Combo正在运行。</p>
<p>9，运行<code>grunt server</code>时报错：“Error: EMFILE, too many open files”</p>
<p>运行：</p>
<pre><code>ulimit -n 10000</code></pre>
<p>10，依赖的yeoman工具版本</p>
<p>该程序在yeoman 1.0.0-rc.1.1 版本下测试通过</p>
<p>11，grunt server后，访问我的文件报错：<code>Fatal error: Cannot read property &#39;host&#39; of undefined</code></p>
<p>是因为你访问的JS或CSS文件在本地不存在，且在线上也不存在，保证本地文件存在即可</p>
<p>默认情况下，你需要保证访问地址的host是g.tbcdn.cn或a.tbcdn.cn，如果使用别的域名，需要在<code>~/.flex-combo/config.json</code>中修改配置项：</p>
<pre><code>hosts:{
    &#39;a.tbcdn.cn&#39;:&#39;122.255.67.241&#39;,
    &#39;g.tbcdn.cn&#39;:&#39;155.238.23.250&#39;,
    &#39;your.host.name&#39;:&#39;155.238.23.250&#39;//ip地址配置到对应的cdn地址
}</code></pre>
<h2>TODO</h2>
<ul>
<li>JSON接口模拟和映射</li>
<li>png 图片的压缩和优化</li>
<li>各条业务线的固定构建脚本</li>
<li><code>yo clam:install</code>/<code>yo clam:search</code>，安装和查找Gallery模块</li>
</ul>


<div id="disqus_thread"></div>
<script>
    if((window.location.hostname.indexOf("kissyui.com")!=-1 )&& window.localStorage.getItem("kissy-commment")!="0"){
    /* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
    var disqus_shortname = 'kissy-docs'; // required: replace example with your forum shortname

    // The following are highly recommended additional parameters. Remove the slashes in front to use.
     //var disqus_identifier = '/anim';
     //var disqus_url = window.location;

    /* * * DON'T EDIT BELOW THIS LINE * * */
    (function() {
        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
        dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
    })();
    }
</script>



      
  <style>
	.github-btn {
		border: 0 none;
		overflow: hidden;
		margin-top:4px;
	}
	footer {
		border-top:1px solid #e2e2e2;
		padding-top:20px;
		clear:both;
	}
	/* iPhone 及以下 */
	@media only screen and (max-width: 767px) {
		.github-link {
			display:none;
		}
	}
  </style>
  <footer>




	<div class="text-center">
		©2013 - 2033 KISSY UI LIBRARY
		<br /> <iframe class="github-btn" src="http://ghbtns.com/github-btn.html?user=kissyteam&amp;repo=kissy&amp;type=watch&amp;count=true" width="100" height="20" title="Star on GitHub"></iframe> 
	<iframe class="github-btn" src="http://ghbtns.com/github-btn.html?user=kissyteam&amp;repo=kissy&amp;type=fork&amp;count=true" width="102" height="20" title="Fork on GitHub"></iframe>
	</div>
  </footer>
    </article>
  </div>
  <a target="_blank" href="https://github.com/kissyteam/kissy" class="github-link"><img alt="Fork me on GitHub" src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" style="position: absolute; top: 0; right: 0; border: 0; z-index: 50"></a>
  <script>
	var S = KISSY;
	(function(){
		S.use('node',function(S){
			S.all('code').each(function(node){
				var className = node.attr('class');
				if(/^lang-/.test(className)){
					var tc = className.replace(/^lang-/,'');
					node.replaceClass(className,tc);
				}
			});
			hljs.tabReplace = '    ';
			hljs.initHighlighting();
		});
	})();
	(function(){
		var h3s = document.getElementsByTagName('h3');
		for(var i = 0;i<h3s.length;i++){
			var str = S.trim(h3s[i].innerHTML);
			try{
				str = str.match(/\w+/)[0];
			}catch(e){
				continue;
			}
			h3s[i].innerHTML = '<a name="'+str+'"></a>' + h3s[i].innerHTML;
		}
	})();
  </script>
</body>
</html>
